home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 5 / Amiga Tools 5.iso / spiele / workbench spiele / krsnake / src / halloffame.e < prev    next >
Text File  |  1996-02-22  |  20KB  |  613 lines

  1. ->
  2. -> ANNVIT CÆPTIS MDCCLXXVI!
  3. ->
  4. ->    Hall of Fame client 1.7 stab
  5. ->
  6. -> $NSAREG: 23F27N06OR2748D5894.3 [Crassus]
  7. ->
  8. -> Copyright © 1995 Psilocybe Software
  9. ->
  10. -> This program is free software; you can redistribute it and/or modify
  11. -> it under the terms of the GNU General Public License as published by
  12. -> the Free Software Foundation; either version 2 of the License, or
  13. -> (at your option) any later version.
  14. ->
  15. -> This program is distributed in the hope that it will be useful,
  16. -> but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. -> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18. -> GNU General Public License for more details.
  19. ->
  20. -> You should have received a copy of the GNU General Public License
  21. -> along with this program; if not, write to the Free Software
  22. -> Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  23. ->
  24. -> $HISTORY:
  25. ->
  26. -> 13 Oct 1995 : 001.007 :  Added locale support
  27. -> 01 Oct 1995 : 001.006 :  Now functions like a listview
  28. -> 22 Sep 1995 : 001.005 :  Understands SNAKE_HIDE/SHOWINTERFACE
  29. -> 13 Sep 1995 : 001.004 :  Performs simple encryption on data file
  30. -> 12 Sep 1995 : 001.003 :  Highlights current player's position
  31. -> 20 Aug 1995 : 001.002 :  Updated to use krsnake.library
  32. -> 27 Jun 1995 : 001.001 :  Initial release
  33. ->
  34. -> NOVUS ORDO SECLORUM!
  35. ->
  36.  
  37. OPT OSVERSION=37
  38.  
  39. MODULE 'intuition/intuition','intuition/screens','dos/dos','graphics/text'
  40. MODULE 'graphics/view','exec/ports','exec/lists','exec/nodes','utility'
  41. MODULE 'reqtools','libraries/reqtools','krsnake','libraries/krsnake'
  42. MODULE 'tools/trapguru','tools/exceptions','exec/tasks','*createpath'
  43. MODULE 'intuition/classes','intuition/gadgetclass','intuition/icclass'
  44. MODULE 'intuition/imageclass','utility/tagitem','locale','*krsnakecat'
  45.  
  46. RAISE   "SCR"   IF  LockPubScreen()=0,
  47.         "WIN"   IF  OpenWindowTagList()=0,
  48.         "DRI"   IF  GetScreenDrawInfo()=0,
  49.         "FONT"  IF  OpenFont()=0,
  50.         "OBJ"   IF  NewObjectA()=0
  51.  
  52. OBJECT playernode
  53.     succ:PTR TO playernode
  54.     pred:PTR TO playernode
  55.     name:PTR TO CHAR
  56.     score:LONG
  57. ENDOBJECT
  58.  
  59. DEF krc=0,w=0:PTR TO window,s=0:PTR TO screen
  60. DEF dri=0:PTR TO drawinfo,font:PTR TO textfont,dripens[NUMDRIPENS]:ARRAY OF INT
  61. DEF ww=160,wh=-1,iw,ih,fy,fh,wx=0,wy=-1,th
  62. DEF killtask=FALSE
  63. DEF hall=0:PTR TO playernode
  64. DEF dn[256]:ARRAY OF CHAR,current=0:PTR TO playernode
  65. DEF visible=0,kp=0:PTR TO kprefs
  66. DEF upimage=0:PTR TO image,downimage=0:PTR TO image,sizeimage=0:PTR TO image
  67. DEF vertgadget=0:PTR TO gadget,upgadget=0:PTR TO gadget,downgadget=0:PTR TO gadget
  68. DEF vtotal=0,vvisible=0,vtop=0,oldscore=0
  69.  
  70. ENUM VERT_GID=1,UP_GID,DOWN_GID
  71.  
  72. PROC max(x,y) IS IF x>y THEN x ELSE y
  73.  
  74. PROC sysisize() IS
  75.  IF s.flags AND SCREENHIRES THEN SYSISIZE_MEDRES ELSE SYSISIZE_LOWRES
  76.  
  77. PROC newimageobject(which) IS
  78.   NewObjectA(NIL,'sysiclass',
  79.     [SYSIA_DRAWINFO,dri,SYSIA_WHICH,which,SYSIA_SIZE,sysisize(),NIL])
  80.  
  81. PROC newpropobject(freedom,taglist) IS
  82.   NewObjectA(NIL,'propgclass',
  83.     [ICA_TARGET,ICTARGET_IDCMP,PGA_FREEDOM,freedom,PGA_NEWLOOK,TRUE,
  84.      PGA_BORDERLESS,(dri.flags AND DRIF_NEWLOOK) AND (dri.depth<>1),
  85.      TAG_MORE,taglist])
  86.  
  87. PROC newbuttonobject(image:PTR TO object,taglist) IS
  88.   NewObjectA(NIL,'buttongclass',
  89.     [ICA_TARGET,ICTARGET_IDCMP,GA_IMAGE,image,TAG_MORE,taglist])
  90.  
  91. PROC updateprop(gadget:PTR TO object,attr,value)
  92.   SetGadgetAttrsA(gadget,w,NIL,[attr,value,NIL])
  93. ENDPROC
  94.  
  95. PROC newplayer(name:PTR TO CHAR,score)
  96.     DEF node:PTR TO playernode,nodename:PTR TO CHAR
  97.     NEW node
  98.     NEW nodename[StrLen(name)+1]
  99.     node.name:=nodename
  100.     copystring(nodename,name)
  101.     node.score:=score
  102.     insertplayer(node)
  103. ENDPROC node
  104.  
  105. PROC deleteplayer(node:PTR TO playernode)
  106.     DEF nodename:PTR TO CHAR
  107.     removeplayer(node)
  108.     nodename:=node.name
  109.     END nodename
  110.     END node
  111. ENDPROC
  112.  
  113. PROC removeplayer(node:PTR TO playernode)
  114.     IF node.succ THEN node.succ::playernode.pred:=node.pred
  115.     IF node.pred THEN node.pred::playernode.succ:=node.succ
  116.     IF hall=node THEN hall:=node.succ
  117.     IF Stricmp(node.name,'Player') THEN DEC vtotal
  118. ENDPROC
  119.  
  120. PROC findplayer(name:PTR TO CHAR)
  121.     DEF node:PTR TO playernode
  122.     node:=hall
  123.     WHILE node
  124.         IF Stricmp(node.name,name)=0 THEN RETURN node
  125.         node:=node.succ
  126.     ENDWHILE
  127.     node:=0
  128. ENDPROC node
  129.  
  130. PROC insertplayer(node:PTR TO playernode)
  131.     DEF c:PTR TO playernode,ok=0
  132.     c:=hall
  133.     IF Stricmp(node.name,'Player') THEN INC vtotal
  134.     IF c=0
  135.         node.succ:=0
  136.         node.pred:=0
  137.         hall:=node
  138.     ELSE
  139.         WHILE ok=0
  140.             IF node.score>=c.score
  141.                 node.pred:=c.pred
  142.                 node.succ:=c
  143.                 IF node.pred
  144.                     node.pred::playernode.succ:=node
  145.                 ELSE
  146.                     hall:=node
  147.                     node.pred:=0
  148.                 ENDIF
  149.                 c.pred:=node
  150.                 ok:=1
  151.             ELSE
  152.                 IF c.succ
  153.                     c:=c.succ
  154.                 ELSE
  155.                     c.succ:=node
  156.                     node.pred:=c
  157.                     node.succ:=0
  158.                     ok:=1
  159.                 ENDIF
  160.             ENDIF
  161.         ENDWHILE
  162.     ENDIF
  163. ENDPROC
  164.  
  165. PROC getname(score)
  166.     DEF node:PTR TO playernode
  167.     RtGetStringA(dn,255,getstr(HALLID_ENTERNAMETITLE),0,[RTGS_TEXTFMT,getstr(HALLID_ENTERNAME),RTGS_FLAGS,GSREQF_CENTERTEXT,NIL])
  168.     IF (node:=findplayer(TrimStr(dn)))
  169.         IF node.score<score
  170.             newplayer(TrimStr(dn),score)
  171.             deleteplayer(node)
  172.         ENDIF
  173.     ELSE
  174.         newplayer(TrimStr(dn),score)
  175.     ENDIF
  176.     renderhall()
  177. ENDPROC
  178.  
  179. PROC readhall() HANDLE
  180.     DEF f=0,b[256]:ARRAY OF CHAR
  181.     f:=Open('ENVARC:KRSNAke/HallOfFame.data',MODE_OLDFILE)
  182.     IF f=0
  183.         newplayer('Captain Merrill Stubing',250)
  184.         newplayer('Dr. Adam Bricker',200)
  185.         newplayer('Isaac Washington',150)
  186.         newplayer('Julie McCoy',100)
  187.         newplayer('Gopher Smith',50)
  188.         Raise("URK")
  189.     ENDIF
  190.     WHILE TRUE
  191.         readstring(f,b)
  192.         rotstring(b)
  193.         newplayer(b,readrotnumeral(f))
  194.     ENDWHILE
  195. EXCEPT DO
  196.     IF f THEN Close(f)
  197. ENDPROC
  198.  
  199. PROC dumphall() HANDLE
  200.     DEF f=0,p:PTR TO playernode,b1[256]:STRING,b2[64]:STRING
  201.     createPath('ENVARC:KRSNAke/urk')
  202.     f:=Open('ENVARC:KRSNAke/HallOfFame.data',MODE_NEWFILE)
  203.     IF f=0 THEN Raise("URK")
  204.     p:=hall
  205.     WHILE p
  206.         IF Stricmp(p.name,'Player')
  207.             StrCopy(b1,p.name)
  208.             StringF(b2,'\d',p.score)
  209.             rotstring(b1)
  210.             rotstring(b2)
  211.             VfPrintf(f,'%s\n%s\n',[b1,b2])
  212.         ENDIF
  213.         p:=p.succ
  214.     ENDWHILE
  215. EXCEPT DO
  216.     IF f THEN Close(f)
  217. ENDPROC
  218.  
  219. PROC dumpsettings() HANDLE
  220.     DEF f=0
  221.     createPath('ENVARC:KRSNAke/urk')
  222.     f:=Open('ENVARC:KRSNAke/HallOfFame.snapshot',MODE_NEWFILE)
  223.     IF f=0 THEN Raise("URK")
  224.     VfPrintf(f,'%ld\n%ld\n%ld\n%ld\n%s\n',[wx,wy,ww,wh,dn])
  225. EXCEPT DO
  226.     IF f THEN Close(f)
  227. ENDPROC
  228.  
  229. PROC readstring(f,s)
  230.     DEF i,b[256]:ARRAY OF CHAR
  231.     IF (Fgets(f,b,255)=0) THEN Raise("URK")
  232.     copystring(s,b)
  233. ENDPROC i
  234.  
  235. PROC copystring(s2,s1)
  236.     MOVE.L  s1,A0
  237.     MOVE.L  s2,A1
  238. copyloop:
  239.     MOVE.B  (A0)+,D0
  240.     CMP.B   #32,D0
  241.     BLT     terminate
  242.     MOVE.B  D0,(A1)+
  243.     BRA     copyloop
  244. terminate:
  245.     CLR.B   (A1)+
  246. ENDPROC
  247.  
  248. PROC rotstring(s)
  249.     MOVE.L  s,A0
  250. rotloop:
  251.     MOVE.B  (A0),D0
  252.     BEQ     endofrot
  253.     EORI.B  #15,D0
  254.     MOVE.B  D0,(A0)+
  255.     BRA     rotloop
  256. endofrot:
  257. ENDPROC
  258.  
  259. PROC readnumeral(f)
  260.     DEF i,b[256]:ARRAY OF CHAR
  261.     IF (Fgets(f,b,255)=0) THEN Raise("URK")
  262.     i:=Val(b)
  263. ENDPROC i
  264.  
  265. PROC readrotnumeral(f)
  266.     DEF i,b[256]:ARRAY OF CHAR
  267.     IF (Fgets(f,b,255)=0) THEN Raise("URK")
  268.     rotstring(b)
  269.     i:=Val(b)
  270. ENDPROC i
  271.  
  272. PROC readsettings()
  273.     DEF f=0
  274.     kp:=KsReadKRSNAkePrefs()
  275.     IF kp=0 THEN Raise("URK")
  276.     IF (f:=Open('ENVARC:KRSNAke/HallOfFame.snapshot',MODE_OLDFILE))
  277.         wx:=readnumeral(f)
  278.         wy:=readnumeral(f)
  279.         ww:=readnumeral(f)
  280.         wh:=readnumeral(f)
  281.         readstring(f,dn)
  282.         Close(f)
  283.     ENDIF
  284. ENDPROC
  285.  
  286. PROC bevelbox(x1,y1,x2,y2,dir=TRUE,bf=0)
  287.     DEF shine,shadow
  288.     IF dir
  289.         shine:=dripens[SHINEPEN]
  290.         shadow:=dripens[SHADOWPEN]
  291.     ELSE
  292.         shine:=dripens[SHADOWPEN]
  293.         shadow:=dripens[SHINEPEN]
  294.     ENDIF
  295.     SetAPen(stdrast,shine)
  296.     RectFill(stdrast,x1,y1,x1,y2)
  297.     RectFill(stdrast,x1+1,y1,x2-1,y1)
  298.     SetAPen(stdrast,shadow)
  299.     RectFill(stdrast,x1+1,y2,x2,y2)
  300.     RectFill(stdrast,x2,y1,x2,y2-1)
  301.     IF bf
  302.         SetAPen(stdrast,bf)
  303.         RectFill(stdrast,x1+1,y1+1,x2-1,y2-1)
  304.     ENDIF
  305. ENDPROC
  306.  
  307. PROC renderhall(noclear=FALSE)
  308.     DEF pc,ty,i=0,p:PTR TO playernode,tp,urk[32]:STRING,name[256]:STRING,u,pw,d=1024,pn=0
  309.     recalcscale()
  310.     GetAttr(PGA_TOP,vertgadget,{vtop})
  311.     IF noclear=FALSE
  312.         SetAPen(stdrast,dripens[BACKGROUNDPEN])
  313.         RectFill(stdrast,w.borderleft+4,fy+4,w.borderleft+iw-5,w.bordertop+ih-5)
  314.     ENDIF
  315.     pc:=(fh-12)/th
  316.     ty:=fy+6+(((fh-12)-(pc*th))/2)
  317.     p:=hall
  318.     tp:=ty+font.baseline
  319.     IF vtop
  320.         FOR i:=0 TO vtop-1 DO p:=p.succ
  321.         i:=0
  322.     ENDIF
  323.     WHILE p AND (i<pc)
  324.         INC i
  325.         IF p=current
  326.             SetAPen(stdrast,dripens[HIGHLIGHTTEXTPEN])
  327.             p:=p.succ
  328.             d:=oldscore
  329.             oldscore:=p.score
  330.             pn:=1
  331.         ELSE
  332.             SetAPen(stdrast,dripens[TEXTPEN])
  333.         ENDIF
  334.         IF (p.score>=d) OR (noclear=FALSE)
  335.             StringF(urk,'\d',p.score)
  336.             StrCopy(name,p.name)
  337.             u:=TextLength(stdrast,urk,StrLen(urk))
  338.             pw:=iw-u-24
  339.             WHILE TextLength(stdrast,name,EstrLen(name))>pw
  340.                 StrCopy(name,p.name,EstrLen(name)-1)
  341.             ENDWHILE
  342.             Move(stdrast,w.borderleft+8,tp)
  343.             Text(stdrast,name,EstrLen(name))
  344.             Move(stdrast,w.borderleft+iw-u-8,tp)
  345.             Text(stdrast,urk,StrLen(urk))
  346.         ELSE
  347.             IF pn THEN i:=pc
  348.         ENDIF
  349.         tp:=tp+th
  350.         p:=p.succ
  351.         IF current THEN IF p=current THEN IF p.succ=0 THEN RETURN
  352.     ENDWHILE
  353. ENDPROC
  354.  
  355. PROC render()
  356.     iw:=w.width-w.borderleft-w.borderright
  357.     ih:=w.height-w.bordertop-w.borderbottom
  358.     fy:=w.bordertop+th+6
  359.     fh:=ih-(th+6)
  360.  
  361.     SetAPen(stdrast,dripens[BACKGROUNDPEN])
  362.     RectFill(stdrast,w.borderleft,w.bordertop,w.borderleft+iw-1,w.bordertop+ih-1)
  363.     bevelbox(w.borderleft,w.bordertop,w.borderleft+iw-1,w.bordertop+th+5)
  364.     bevelbox(w.borderleft,fy,w.borderleft+iw-1,w.bordertop+ih-1)
  365.     bevelbox(w.borderleft+3,fy+3,w.borderleft+iw-4,w.bordertop+ih-4,FALSE)
  366.     SetAPen(stdrast,dripens[HIGHLIGHTTEXTPEN])
  367.     Move(stdrast,w.borderleft+8,w.bordertop+font.baseline+3)
  368.     Text(stdrast,getstr(HALLID_PLAYER),StrLen(getstr(HALLID_PLAYER)))
  369.     Move(stdrast,w.borderleft+iw-8-TextLength(stdrast,getstr(HALLID_SCORE),StrLen(getstr(HALLID_SCORE))),w.bordertop+font.baseline+3)
  370.     Text(stdrast,getstr(HALLID_SCORE),StrLen(getstr(HALLID_SCORE)))
  371.     renderhall()
  372. ENDPROC
  373.  
  374. PROC openKRSNAkeLib()
  375.     DEF base=0
  376.     base:=OldOpenLibrary('krsnake.library')
  377.     IF base=0 THEN OldOpenLibrary('Libs/krsnake.library')
  378.     IF base=0 THEN OldOpenLibrary('PROGDIR:Libs/krsnake.library')
  379.     IF base=0 THEN OldOpenLibrary('/Libs/krsnake.library')
  380.     IF base=0 THEN OldOpenLibrary('PROGDIR:/Libs/krsnake.library')
  381.     IF base=0 THEN Raise("klib")
  382. ENDPROC base
  383.  
  384. PROC recalcscale()
  385.     vvisible:=(fh-12)/th
  386.     updateprop(vertgadget,PGA_VISIBLE,vvisible)
  387.     updateprop(vertgadget,PGA_TOTAL,vtotal)
  388. ENDPROC
  389.  
  390. PROC appear()
  391.     DEF resolution,topborder,uw,uh,bw,bh,rw,rh,gw,gap
  392.     IF visible=0
  393.         IF StrLen(kp.pubscreen)
  394.             s:=LockPubScreen(kp.pubscreen)
  395.         ELSE
  396.             s:=LockPubScreen(NIL)
  397.         ENDIF
  398.         font:=OpenFont(s.font)
  399.         dri:=GetScreenDrawInfo(s)
  400.         dripens:=dri.pens
  401.         th:=font.ysize
  402.         IF wh=-1 THEN wh:=(th*13)+32
  403.         IF wy=-1 THEN wy:=s.barheight+1
  404.         sizeimage:=newimageobject(SIZEIMAGE)
  405.         upimage:=newimageobject(UPIMAGE)
  406.         downimage:=newimageobject(DOWNIMAGE)
  407.         resolution:=sysisize()
  408.         topborder:=s.wbortop+font.ysize+1
  409.         uw:=sizeimage.width
  410.         uh:=sizeimage.height
  411.         bw:=IF resolution=SYSISIZE_LOWRES THEN 1 ELSE 2
  412.         bh:=IF resolution=SYSISIZE_HIRES THEN 2 ELSE 1
  413.         rw:=IF resolution=SYSISIZE_HIRES THEN 3 ELSE 2
  414.         rh:=IF resolution=SYSISIZE_HIRES THEN 2 ELSE 1
  415.         gw:=max(upimage.width,uw)
  416.         gw:=max(downimage.width,gw)
  417.         gap:=1
  418.         vertgadget:=newpropobject(FREEVERT,
  419.           [GA_RELRIGHT,bw-gw+3,
  420.            GA_TOP,topborder+rh,
  421.            GA_WIDTH,gw-bw-bw-4,
  422.            GA_RELHEIGHT,(-topborder)-uh-upimage.height-downimage.height-rh-rh,
  423.            GA_RIGHTBORDER,TRUE,
  424.            GA_ID,VERT_GID,
  425.            PGA_TOTAL,vtotal,
  426.            PGA_VISIBLE,1,
  427.            NIL])
  428.         upgadget:=newbuttonobject(upimage,
  429.           [GA_RELRIGHT,(1)-upimage.width,
  430.            GA_RELBOTTOM,(1)-upimage.height-downimage.height-uh,
  431.            GA_RIGHTBORDER,TRUE,
  432.            GA_PREVIOUS,vertgadget,
  433.            GA_ID,UP_GID,
  434.            NIL])
  435.         downgadget:=newbuttonobject(downimage,
  436.           [GA_RELRIGHT,(1)-downimage.width,
  437.            GA_RELBOTTOM,(1)-downimage.height-uh,
  438.            GA_RIGHTBORDER,TRUE,
  439.            GA_PREVIOUS,upgadget,
  440.            GA_ID,DOWN_GID,
  441.            NIL])
  442.         w:=OpenWindowTagList(NIL,[WA_WIDTH,ww,WA_HEIGHT,wh,
  443.                                   WA_LEFT,wx,WA_TOP,wy,
  444.                                   WA_TITLE,'Hall of Fame v1.7',
  445.                                   WA_SIZEGADGET,TRUE,
  446.                                   WA_DRAGBAR,TRUE,
  447.                                   WA_DEPTHGADGET,TRUE,
  448.                                   WA_CLOSEGADGET,TRUE,
  449.                                   WA_ACTIVATE,FALSE,
  450.                                   WA_SMARTREFRESH,TRUE,
  451.                                   WA_SIZEBRIGHT,TRUE,
  452.                                   WA_NEWLOOKMENUS,TRUE,
  453.                                   WA_SCREENTITLE,'KRSNAke Hall of Fame v1.7',
  454.                                   WA_AUTOADJUST,TRUE,
  455.                                   WA_PUBSCREEN,s,
  456.                                   WA_RMBTRAP,TRUE,
  457.                                   WA_IDCMP,IDCMP_CLOSEWINDOW OR IDCMP_REFRESHWINDOW OR IDCMP_NEWSIZE OR IDCMP_RAWKEY OR IDCMP_IDCMPUPDATE,
  458.                                   WA_GADGETS,vertgadget,
  459.                                   NIL])
  460.         WindowLimits(w,w.borderleft+w.borderright+128,w.bordertop+w.borderbottom+(th*12),-1,-1)
  461.         SetStdRast(w.rport)
  462.         SetFont(stdrast,font)
  463.         render()
  464.         visible:=1
  465.     ENDIF
  466. ENDPROC
  467.  
  468. PROC vanish()
  469.     IF visible
  470.         wx:=w.leftedge;wy:=w.topedge;ww:=w.width;wh:=w.height
  471.         IF w THEN CloseWindow(w)
  472.         IF vertgadget THEN DisposeObject(vertgadget)
  473.         IF upgadget THEN DisposeObject(upgadget)
  474.         IF downgadget THEN DisposeObject(downgadget)
  475.         IF sizeimage THEN DisposeObject(sizeimage)
  476.         IF upimage THEN DisposeObject(upimage)
  477.         IF downimage THEN DisposeObject(downimage)
  478.         IF dri THEN FreeScreenDrawInfo(s,dri)
  479.         IF font THEN CloseFont(font)
  480.         IF s THEN UnlockPubScreen(NIL,s)
  481.         w:=0;dri:=0;font:=0;s:=0;visible:=0
  482.         sizeimage:=0;upimage:=0;downimage:=0
  483.         vertgadget:=0;upgadget:=0;downgadget:=0
  484.     ENDIF
  485. ENDPROC
  486.  
  487. PROC main() HANDLE
  488.     DEF sig,mask,icl,ico,iad,msg:PTR TO intuimessage,postpone=0,fnord=0,v,oldtop
  489.     trapguru()
  490.     krsnakebase:=openKRSNAkeLib()
  491.     IF (reqtoolsbase:=OpenLibrary('reqtools.library',38))=0 THEN Throw("LIB",'reqtools.library')
  492.     IF (utilitybase:=OpenLibrary('utility.library',37))=0 THEN Throw("LIB",'utility.library')
  493.     localebase:=OpenLibrary('locale.library',37)
  494.     openCatalog()
  495.     copystring(dn,'Crassus')
  496.     GetVar('USER',dn,255,NIL)
  497.     readsettings()
  498.     readhall()
  499.     SetTaskPri(FindTask(NIL),kp.priority)
  500.     IF (krc:=KsRegisterClient())=0 THEN Throw("krsX",getstr(ERRORID_NOKRSNAKE))
  501.  
  502.     REPEAT
  503.         IF visible
  504.             mask:=Shl(1,KsGetClientSig(krc)) OR Shl(1,w.userport::mp.sigbit)
  505.         ELSE
  506.             mask:=Shl(1,KsGetClientSig(krc))
  507.         ENDIF
  508.         sig:=Wait(mask)
  509.         IF And(sig,Shl(1,KsGetClientSig(krc)))
  510.             fnord:=0
  511.             WHILE KsReadEvent(krc,{icl},{ico})
  512.                 SELECT icl
  513.                     CASE SNAKE_NEWGAME
  514.                         oldscore:=0
  515.                         current:=newplayer('Player',0)
  516.                         renderhall()
  517.                     CASE SNAKE_NEWSCORE
  518.                         postpone:=ico
  519.                         fnord:=1
  520.                     CASE SNAKE_QUIT
  521.                         killtask:=TRUE
  522.                     CASE SNAKE_GAMEOVER
  523.                         deleteplayer(current)
  524.                         current:=0
  525.                         getname(ico)
  526.                     CASE SNAKE_SHOWINTERFACE
  527.                         appear()
  528.                     CASE SNAKE_HIDEINTERFACE
  529.                         vanish()
  530.                 ENDSELECT
  531.             ENDWHILE
  532.             IF fnord=0 AND postpone>0 AND current
  533.                 removeplayer(current)
  534.                 current.score:=postpone
  535.                 insertplayer(current)
  536.                 IF visible THEN renderhall(TRUE)
  537.                 postpone:=0
  538.             ENDIF
  539.         ELSEIF visible=1
  540.             IF And(sig,Shl(1,w.userport::mp.sigbit))
  541.                 WHILE (msg:=GetMsg(w.userport))
  542.                     icl:=msg.class
  543.                     ico:=msg.code
  544.                     iad:=msg.iaddress
  545.                     ReplyMsg(msg)
  546.                     SELECT icl
  547.                         CASE IDCMP_CLOSEWINDOW
  548.                             killtask:=TRUE
  549.                         CASE IDCMP_REFRESHWINDOW
  550.                             render()
  551.                         CASE IDCMP_NEWSIZE
  552.                             recalcscale()
  553.                             render()
  554.                         CASE IDCMP_RAWKEY
  555.                             IF ico=$45 THEN killtask:=TRUE
  556.                             IF ico=$4C
  557.                                 GetAttr(PGA_TOP,vertgadget,{oldtop})
  558.                                 IF oldtop>0
  559.                                     updateprop(vertgadget,PGA_TOP,oldtop-1)
  560.                                     renderhall()
  561.                                 ENDIF
  562.                             ENDIF
  563.                             IF ico=$4D
  564.                                 GetAttr(PGA_TOP,vertgadget,{oldtop})
  565.                                 IF oldtop<(vtotal-vvisible)
  566.                                     updateprop(vertgadget,PGA_TOP,oldtop+1)
  567.                                     renderhall()
  568.                                 ENDIF
  569.                             ENDIF
  570.                         CASE IDCMP_IDCMPUPDATE
  571.                             v:=GetTagData(GA_ID,0,iad)
  572.                             SELECT v
  573.                                 CASE VERT_GID
  574.                                     GetAttr(PGA_TOP,vertgadget,{oldtop})
  575.                                     IF oldtop<>vtop THEN renderhall()
  576.                                 CASE UP_GID
  577.                                     GetAttr(PGA_TOP,vertgadget,{oldtop})
  578.                                     IF oldtop>0
  579.                                         updateprop(vertgadget,PGA_TOP,oldtop-1)
  580.                                         renderhall()
  581.                                     ENDIF
  582.                                 CASE DOWN_GID
  583.                                     GetAttr(PGA_TOP,vertgadget,{oldtop})
  584.                                     IF oldtop<(vtotal-vvisible)
  585.                                         updateprop(vertgadget,PGA_TOP,oldtop+1)
  586.                                         renderhall()
  587.                                     ENDIF
  588.                             ENDSELECT
  589.                     ENDSELECT
  590.                 ENDWHILE
  591.             ENDIF
  592.         ENDIF
  593.     UNTIL killtask
  594.  
  595.     vanish()
  596.     dumphall()
  597.     dumpsettings()
  598.  
  599. EXCEPT DO
  600.     IF krc THEN KsRemoveClient(krc)
  601.     vanish()
  602.     closeCatalog()
  603.     IF kp THEN FreeVec(kp)
  604.     IF utilitybase THEN CloseLibrary(utilitybase)
  605.     IF reqtoolsbase THEN CloseLibrary(reqtoolsbase)
  606.     IF localebase THEN CloseLibrary(localebase)
  607.     IF krsnakebase THEN CloseLibrary(krsnakebase)
  608.     IF exception THEN report_exception()
  609. ENDPROC
  610.  
  611. CHAR '$VER: HallOfFame 1.007 (13 Oct 1995) stable beta test version'
  612.  
  613.